]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
fileUtils: Refactor collectFromDatadirs to be a generator
authorEvan Welsh <contact@evanwelsh.com>
Wed, 30 Nov 2022 02:17:20 +0000 (20:17 -0600)
committerMarge Bot <marge-bot@gnome.org>
Thu, 1 Dec 2022 12:59:32 +0000 (12:59 +0000)
This change enables mapping each collected file to a Promise in
asynchronous operations.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2364>

js/misc/fileUtils.js
js/ui/extensionSystem.js
js/ui/remoteSearch.js
js/ui/sessionMode.js

index 4c86948a91c2b4bf76e6579d6a2e21428a0bcb70..e9ea92a519feebca892015b2e7e6c5252cb412c4 100644 (file)
@@ -6,7 +6,20 @@ const { Gio, GLib } = imports.gi;
 
 var { loadInterfaceXML } = imports.misc.dbusUtils;
 
-function collectFromDatadirs(subdir, includeUserDir, processFile) {
+/**
+ * @typedef {object} SubdirInfo
+ * @property {Gio.File} dir the file object for the subdir
+ * @property {Gio.FileInfo} info the file descriptor for the subdir
+ */
+
+/**
+ * @param {string} subdir the subdirectory to search within the data directories
+ * @param {boolean} includeUserDir whether the user's data directory should also be searched in addition
+ *                                 to the system data directories
+ * @returns {Generator<SubdirInfo, void, void>} a generator which yields file info for subdirectories named
+ *                                              `subdir` within data directories
+ */
+function* collectFromDatadirs(subdir, includeUserDir) {
     let dataDirs = GLib.get_system_data_dirs();
     if (includeUserDir)
         dataDirs.unshift(GLib.get_user_data_dir());
@@ -18,14 +31,14 @@ function collectFromDatadirs(subdir, includeUserDir, processFile) {
         let fileEnum;
         try {
             fileEnum = dir.enumerate_children('standard::name,standard::type',
-                                              Gio.FileQueryInfoFlags.NONE, null);
+                Gio.FileQueryInfoFlags.NONE, null);
         } catch (e) {
             fileEnum = null;
         }
         if (fileEnum != null) {
             let info;
             while ((info = fileEnum.next_file(null)))
-                processFile(fileEnum.get_child(info), info);
+                yield {dir: fileEnum.get_child(info), info};
         }
     }
 }
index c21cc7cded012660970465edd0e7625980759c8c..c66df59a1f1faae9514d6b92e1a7d41cb8f25154 100644 (file)
@@ -571,10 +571,10 @@ var ExtensionManager = class extends Signals.EventEmitter {
         if (!this.updatesSupported)
             return;
 
-        FileUtils.collectFromDatadirs('extension-updates', true, (dir, info) => {
+        for (const {dir, info} of FileUtils.collectFromDatadirs('extension-updates', true)) {
             let fileType = info.get_file_type();
             if (fileType !== Gio.FileType.DIRECTORY)
-                return;
+                continue;
             let uuid = info.get_name();
             let extensionDir = Gio.File.new_for_path(
                 GLib.build_filenamev([global.userdatadir, 'extensions', uuid]));
@@ -587,7 +587,7 @@ var ExtensionManager = class extends Signals.EventEmitter {
             } finally {
                 FileUtils.recursivelyDeleteDir(dir, true);
             }
-        });
+        }
     }
 
     _loadExtensions() {
@@ -609,15 +609,17 @@ var ExtensionManager = class extends Signals.EventEmitter {
         this._enabledExtensions = this._getEnabledExtensions();
 
         let perUserDir = Gio.File.new_for_path(global.userdatadir);
-        FileUtils.collectFromDatadirs('extensions', true, (dir, info) => {
+
+        const extensionFiles = [...FileUtils.collectFromDatadirs('extensions', true)];
+        const extensionObjects = extensionFiles.map(({dir, info}) => {
             let fileType = info.get_file_type();
-            if (fileType != Gio.FileType.DIRECTORY)
-                return;
+            if (fileType !== Gio.FileType.DIRECTORY)
+                return null;
             let uuid = info.get_name();
             let existing = this.lookup(uuid);
             if (existing) {
                 log(`Extension ${uuid} already installed in ${existing.path}. ${dir.get_path()} will not be loaded`);
-                return;
+                return null;
             }
 
             let extension;
@@ -626,12 +628,16 @@ var ExtensionManager = class extends Signals.EventEmitter {
                 : ExtensionType.SYSTEM;
             try {
                 extension = this.createExtensionObject(uuid, dir, type);
-            } catch (e) {
-                logError(e, `Could not load extension ${uuid}`);
-                return;
+            } catch (error) {
+                logError(error, `Could not load extension ${uuid}`);
+                return null;
             }
+
+            return extension;
+        }).filter(extension => extension !== null);
+
+        for (const extension of extensionObjects)
             this.loadExtension(extension);
-        });
     }
 
     _enableAllExtensions() {
index 87ee3840a3256ab93caa3c878d30a887af2086d5..cef6f9cd3502a0e95486fe973fcbaac3716b7697 100644 (file)
@@ -139,7 +139,8 @@ function loadRemoteSearchProviders(searchSettings) {
     if (searchSettings.get_boolean('disable-external'))
         return [];
 
-    FileUtils.collectFromDatadirs('search-providers', false, loadRemoteSearchProvider);
+    for (const {dir} of FileUtils.collectFromDatadirs('search-providers', false))
+        loadRemoteSearchProvider(dir);
 
     let sortOrder = searchSettings.get_strv('sort-order');
 
index b38bcdfabf1b1bf413c5b3216db02593f872163a..c67b4a7b4bf23324fee49e8eebf51288582a1b5b 100644 (file)
@@ -126,8 +126,12 @@ function _loadMode(file, info) {
     _modes[modeName]['isPrimary'] = true;
 }
 
+/**
+ * Loads external session modes from the system data directories.
+ */
 function _loadModes() {
-    FileUtils.collectFromDatadirs('modes', false, _loadMode);
+    for (const {dir, info} of FileUtils.collectFromDatadirs('modes', false))
+        _loadMode(dir, info);
 }
 
 function listModes() {